﻿Imports System.IO
Imports Commander_Wars.Spieletools
Public Class ObjektScript
    Implements ICloneable
#Region "Allgemein"
    Enum Pruefstadien
        RundenAnfang
        RundenMitte
        RundenEnde
    End Enum
    Public Shared Scripts() As ObjektScript = {}
    Public Shared Variablen As New List(Of GebaeudeFabrik.Variable)
    Public Shared ScriptName As String
    Public Shared ScriptUpdateDone As Boolean = False
    ''' <summary>
    ''' Loescht alle vorhandenen Scripte.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Reset()
        Array.Resize(Scripts, 0)
        Variablen.Clear()
        ScriptName = ""
    End Sub

    ''' <summary>
    ''' Loescht alle vorhandenen Scripte und laedt ein neues.
    ''' </summary>
    ''' <param name="Scriptname">Wie das Script heisst, welches verwendet werden soll. die vorangegangenen Ordner interessieren nicht, die weiss ich selber. Das .script am Ende kannst du dir sparen wenn du willst, musst du aber im Gegensatz zu den Ordnern mit Ressourcenpfad und so nicht</param>
    ''' <remarks></remarks>
    Public Shared Sub NeuScript(ByVal Scriptname As String, ByVal DeleteKonverter As Boolean)
        Reset()
        If DeleteKonverter Then DialogTextSprachKonverter.Reset()
        ObjektScript.ScriptName = Scriptname
        addScript(Scriptname)
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Objektverwalter.Spielfeld.Scripts = Scripts
        End If
    End Sub

    ''' <summary>
    ''' Laedt ein neues Script, ohne die alten wegzuschmeisen
    ''' </summary>
    ''' <param name="Scriptname">Wie das Script heisst, welches verwendet werden soll. die vorangegangenen Ordner interessieren nicht, die weiss ich selber. Das .script am Ende kannst du dir sparen wenn du willst, musst du aber im Gegensatz zu den Ordnern mit Ressourcenpfad und so nicht</param>
    ''' <remarks></remarks>
    Public Shared Sub addScript(ByVal Scriptname As String)
        If Not Scriptname.EndsWith(".script") Then Scriptname += ".script"
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Scripts\" + Scriptname) Then
            Dim strR As New StreamReader(DataSettings.Resourcenpfad + "Scripts\" + Scriptname, Hauptmenue.Codierung)
            Dim NeuScript As New ObjektScript
            While Not strR.EndOfStream 'Kann man alternativ natuerlich auch mit einem serializble oder so machen, allerdings kann ich das nicht.
                'Tja was jetzt kommt ist noch nicht so genau festgelegt.
                Dim z As String = strR.ReadLine
                z = z.Trim
                If z = "" Then Continue While 'Leerzeilen bergen keine Informationen.
                If z.StartsWith("'") Then Continue While 'Komentare schon, sind aber fuer uns (jetzt) nicht weiter wichtig :)
                Try
                    If z.ToLower.StartsWith("newvariable:") Then
                        Dim S() As String = z.Remove(0, z.IndexOf(":") + 1).Split("|")
                        Variablen.Add(New GebaeudeFabrik.Variable(S(0), CInt(S(1))))
                        Continue While
                    End If

                    If z.StartsWith("###") Then
                        NeuScript = New ObjektScript
                        Continue While
                    End If
                    'Ausloeser:
                    If z.StartsWith("Tag:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addBedingungTag(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("Tag>") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addBedingungTagGroesser(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("Tag<") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addBedingungTagKleiner(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("Tag*") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addBedingungJedenXTag(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("Besetzt:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addBedingungBesetzt(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addBedingungBesetzt(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If
                    If z.StartsWith("Sieg:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        NeuScript.addBedingungSieg(z)
                        Continue While
                    End If
                    If z.StartsWith("Feuerladung:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addBedingungFeuerbereit(s(0), s(1), s(3), s(2))
                        Else
                            NeuScript.addBedingungFeuerbereit(s(0), s(1), s(2), )
                        End If
                        Continue While
                    End If
                    If z.StartsWith("NachXZuegenImmer:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungNachXZuegenImmer(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("LandkartenZustand:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        Dim Zustand As Mission.MissionsZustaende = CInt(s(1))
                        NeuScript.addBedingungLandkarteZustand(s(0), Zustand)
                        Continue While
                    End If
                    If z.StartsWith("CountLandkarteZustand:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        Dim Zustand As Mission.MissionsZustaende = CInt(s(3))
                        NeuScript.addBedingungCountLandkarteZustand(s(0), s(1), s(2), Zustand)
                        Continue While
                    End If
                    If z.StartsWith("GebaeudeZerstoert:") Or z.ToLower.StartsWith("GebaeudeZerstoert:".ToLower) Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        If s.Length > 2 Then
                            NeuScript.addBedingungGebaeudeZerstoert(s(0), s(1), s(2))
                        Else
                            NeuScript.addBedingungGebaeudeZerstoert(s(0), s(1))
                        End If

                        Continue While
                    End If
                    If z.ToLower.StartsWith("spielerbesiegt:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        NeuScript.addBedingungSpielerBesiegt(z)
                    End If
                    If z.ToLower.StartsWith("inbereich:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungInBereich(New Point(s(0), s(1)), New Point(s(2), s(3)), s(4), s(5))
                    End If
                    If z.ToLower.StartsWith("einheitzerstoert:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        If s.Length > 2 Then
                            NeuScript.addBedingungEinheitZerstoert(s(0), s(1), s(2))
                        Else
                            NeuScript.addBedingungEinheitZerstoert(s(0), s(1))
                        End If
                    End If
                    If z.ToLower.StartsWith("feldleer:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        If s.Length > 2 Then
                            NeuScript.addBedingungFeldLeer(s(0), s(1), s(2))
                        Else
                            NeuScript.addBedingungFeldLeer(s(0), s(1))
                        End If
                    End If
                    If z.ToLower.StartsWith("zufall:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        NeuScript.addBedingungZufall(z)
                    End If
                    If z.ToLower.StartsWith("variablegleich:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungVariableIstGleich(s(0), s(1))
                    End If
                    If z.ToLower.StartsWith("variablekleiner:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungVariableKleiner(s(0), s(1))
                    End If
                    If z.ToLower.StartsWith("variablegroesser:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungVariableGroesser(s(0), s(1))
                    End If
                    If z.ToLower.StartsWith("variablegroessergleich:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedingungVariableGroesserGleich(s(0), s(1))
                    End If
                    If z.ToLower.StartsWith(Bedingungsarten.EinheitenZahl.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedinungEinheitenZahl(s(0), s(1), s(2))
                    End If
                    If z.ToLower.StartsWith(Bedingungsarten.GebaeudeZahl.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s As String() = z.Split("|")
                        NeuScript.addBedinungGebaeudeZahl(s(0), s(1), s(2))
                    End If

                    'Ereignisse:
                    If z.StartsWith("Dialog:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 3 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        NeuScript.addEreignisDialog(Chat, s(0), s(1), CInt(s(2)))
                        Continue While
                    End If
                    If z.ToLower.StartsWith("Dialog2:".ToLower) Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        Dim Chat As String = ""
                        For i = 5 To s.Length - 2
                            Chat += s(i) + "|"
                        Next
                        Chat += s(s.Length - 1)
                        NeuScript.addEreignisDialog(Chat, s(0), s(1), CInt(s(2)), s(3), s(4))
                        Continue While
                    End If
                    If z.Trim.StartsWith("%") Then
                        'hm.. eine Sprach...
                        Dim s() As String = z.Split("%")
                        DialogTextSprachKonverter.SprachKonvIni.AddEintrag(s(1), s(3), s(2))
                    End If
                    If z.StartsWith("EinheitE:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 6 Then
                            NeuScript.addEreignisEinheitErschaffen(s(0), s(1), s(2), s(3), s(4), s(5), s(6))
                        Else
                            NeuScript.addEreignisEinheitErschaffen(s(0), s(1), s(2), s(3), s(4), s(5))
                        End If
                        Continue While
                    End If
                    If z.StartsWith("SetKP:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisSetKP(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addEreignisSetKP(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If
                    If z.StartsWith("SetKO:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisSetKO(s(0), s(1), s(2))
                        Continue While
                    End If
                    If z.StartsWith("Schadenswelle:") Then
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisSchadenswelle(s(0), s(1))
                        Continue While
                    End If
                    If z.ToLower.StartsWith("landkarte|") Then
                        Dim s() As String = z.Split("|")
                        Select Case s(1).ToLower
                            Case "mgewonnen"
                                NeuScript.addEreignisLandkarteMGewonnen(s(2))
                            Case "mauswaehlbar"
                                NeuScript.addEreignisLandkarteMAuswaehlbar(s(2))
                            Case "mnichtauswaehlbar"
                                NeuScript.addEreignisLandkarteSetZustand(s(2), Mission.MissionsZustaende.NichtAnwaehlbar)
                        End Select
                    End If
                    If z.StartsWith("Gewonnen:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        NeuScript.addEreignisSieg(z)
                        Continue While
                    End If
                    If z.StartsWith("SetFeuerladung:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisSetFeuerLadung(s(0), s(1), s(3), s(2))
                        Else
                            NeuScript.addEreignisSetFeuerLadung(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If
                    If z.ToLower.StartsWith("addwarteeinheit:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisAddWarteEinheit(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addEreignisAddWarteEinheit(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If

                    If z.ToLower.StartsWith("removeblockierteeinheit:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisRemoveBlockierteEinheit(s(0), s(1))
                    End If
                    If z.ToLower.StartsWith("setfabrikfonds:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisSetFabrikfonds(s(0), s(1), s(2))
                    End If

                    If z.ToLower.StartsWith("neutralergebaeudeangriff:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisSetNeutralerGebaeudeAngriff(s(0), s(1))
                    End If

                    If z.ToLower.StartsWith("increasevariable:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.adEreignisIncreaseVariable(s(0), s(1))
                    End If

                    If z.ToLower.StartsWith("setvariable:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisSetVariable(s(0), s(1))
                    End If

                    If z.ToLower.StartsWith("besiegt:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisDefearPlayer(s(0))
                    End If

                    If z.ToLower.StartsWith("setbuildingfirerange:") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisSetBuildingFirerange(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addEreignisSetBuildingFirerange(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If

                    If z.ToLower.StartsWith(Ereignisarten.SetBuildingDamage.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisSetBuildingDamage(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addEreignisSetBuildingDamage(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If

                    If z.ToLower.StartsWith(Ereignisarten.SetVulkanChance.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        If s.Length > 3 Then
                            NeuScript.addEreignisSetVulkanChance(s(0), s(1), s(2), s(3))
                        Else
                            NeuScript.addEreignisSetVulkanChance(s(0), s(1), s(2))
                        End If
                        Continue While
                    End If

                    If z.ToLower.StartsWith(Ereignisarten.UnHideArea.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisUnHideArea(s(0), s(1), s(2), s(3), s(4))
                        Continue While
                    End If

                    If z.ToLower.StartsWith(Ereignisarten.AddVolcanTarget.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisAddVolcanTarget(s(0), s(1), s(2), s(3), s(4))
                        Continue While
                    End If

                    If z.ToLower.StartsWith(Ereignisarten.ClearVolcanTarget.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisClearVolcanTarget(s(0), s(1))
                        Continue While
                    End If
                    If z.ToLower.StartsWith(Ereignisarten.CreateFog.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisCreateFog(s(0), s(1), s(2), s(3), s(4), s(5))
                        Continue While
                    End If
                    If z.ToLower.StartsWith(Ereignisarten.ChangeCOPowerState.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisChangeCOPowerstate(s(0), s(1))
                        Continue While
                    End If
                    If z.ToLower.StartsWith(Ereignisarten.CreateCOClone.ToString.ToLower + ":") Then
                        z = z.Remove(0, z.IndexOf(":") + 1)
                        Dim s() As String = z.Split("|")
                        NeuScript.addEreignisCreateCOClone(s(0), s(2), s(1), s(3))
                        Continue While
                    End If
                Catch
                    Konsole.Write("Error: Couldn't load Script correctly. The Script File is damaged.")
                End Try
            End While
            strR.Dispose() 'Brauchen wir nicht mehr.
        Else
            ' Console.WriteLine("Das Script: """ + Scriptname + """ konnte nicht gefunden werden.")
        End If
    End Sub

    ''' <summary>
    ''' Prueft, ob Scripte ausgefuehrt werden koennen und fuehrt sie auch aus.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub Pruefen(ByVal Pruefstadium As Pruefstadien)
        ScriptUpdateDone = False
        'Only the Host can launch or check a script
        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                If Hauptmenue.Connection.Hosten Then
                    If Scripts IsNot Nothing Then
                        If Scripts.Length > 0 Then
                            For Each Script In Scripts
                                Script.ScriptPruefen(Pruefstadium)
                            Next
                        End If
                    End If
                    'Script Check is finished.
                    Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|ScriptUpdate"))
                Else
                    Exit Sub
                End If
            End If
        End If
        If Scripts IsNot Nothing Then
            If Scripts.Length > 0 Then
                For Each Script In Scripts
                    Script.ScriptPruefen(Pruefstadium)
                Next
            End If
        End If
        ScriptUpdateDone = True
    End Sub

    Public Shared Function GetVariable(ByVal Name As String) As GebaeudeFabrik.Variable
        For I = 0 To Variablen.Count - 1
            If Variablen(I).Name = Name Then
                Return Variablen(I)
            End If
        Next
        Return Nothing
    End Function

#End Region
#Region "Eine Instanz"

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim Klon As ObjektScript = MemberwiseClone()
        ReDim Klon.Bedingungen(Bedingungen.Length - 1)
        For I = 0 To Klon.Bedingungen.Length - 1
            Klon.Bedingungen(I) = Bedingungen(I).Clone
        Next
        ReDim Klon.Ereignisse(Ereignisse.Length - 1)
        For I = 0 To Klon.Ereignisse.Length - 1
            Klon.Ereignisse(I) = Ereignisse(I).Clone
        Next
        Return Klon
    End Function
    Public Bedingungen() As Bedingung = {}
    Public Ereignisse() As Ereignis = {}
    Dim Ausgefuehrt As Boolean = False
    Public Sub Write(ByRef StrW As Filestream)
        StrW.WriteByte(Ausgefuehrt)
        For I = 0 To Bedingungen.Count - 1
            Bedingungen(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        For I = 0 To Ereignisse.Count - 1
            Ereignisse(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
    End Sub
    Public Sub Read(ByRef StrR As Filestream)

        Ausgefuehrt = StrR.ReadByte()
        Dim Ende(3) As Byte
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                ReadBedingung(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        Ende = New Byte() {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                ReadEreignis(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
    End Sub
    Sub New()
        Array.Resize(Scripts, Scripts.Length + 1)
        Scripts(Scripts.Length - 1) = Me
    End Sub

    ''' <summary>
    ''' Setzt die Bedingung, das das Ereignis ausgeloest wird, wenn ein bestimmter Tag anbricht
    ''' </summary>
    ''' <param name="Tag">Der wievielte Tag</param>
    ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgeloest werden soll.</param>
    ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgeloest werden soll.</param>
    ''' <remarks></remarks>
    Sub addBedingungTag(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTag(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungTagGroesser(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTagGroesser(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungTagKleiner(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungTagKleiner(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungJedenXTag(ByVal Tag As Integer, ByVal Rundenanfang As Boolean, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungJedenXTag(Tag, Rundenanfang, Spieler)
    End Sub
    Sub addBedingungBesetzt(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungBesetzt(KooX, KooY, Spieler)
    End Sub
    Sub addBedingungBesetzt(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Schlachtfeld As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungBesetzt(KooX, KooY, Spieler, Schlachtfeld)
    End Sub
    Sub addBedingungSieg(ByVal Team As Char)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungSieg(Team)
    End Sub
    Sub addBedingungFeuerbereit(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerladung As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungFeuerbereit(X, Y, Schlacht, Feuerladung)
    End Sub
    Sub addBedingungNachXZuegenImmer(ByVal Tage As Integer, ByVal StartTag As Integer, ByVal Pruefstadium As Pruefstadien)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungNachXZuegenImmer(Tage, StartTag, Pruefstadium)
    End Sub
    Sub addBedingungLandkarteZustand(ByVal Karte As Integer, ByVal Zustand As Mission.MissionsZustaende)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungLandkarteZustand(Karte, Zustand)
    End Sub
    Sub addBedingungCountLandkarteZustand(ByVal StartKarte As Integer, ByVal Endkarte As Integer, ByVal Count As Integer, ByVal Zustand As Mission.MissionsZustaende)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungCountLandkarteZustand(StartKarte, Endkarte, Count, Zustand)
    End Sub
    Sub addBedingungGebaeudeZerstoert(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungGebaeudeZerstoert(X, Y, Schlacht)
    End Sub
    Sub addBedingungSpielerBesiegt(ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungSpielerBesiegt(Spieler)
    End Sub
    Sub addBedingungInBereich(ByVal P1 As Point, ByVal P2 As Point, ByVal Schlacht As Integer, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungInBereich(P1, P2, Spieler, Schlacht)
    End Sub
    Sub addBedingungEinheitZerstoert(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungEinheitZerstoert(X, Y, Schlacht)
    End Sub
    Sub addBedingungFeldLeer(ByVal X As Integer, ByVal Y As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungFeldLeer(X, Y, Schlacht)
    End Sub
    Sub addBedingungZufall(ByVal Wahrscheinlichkeit As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungZufall(Wahrscheinlichkeit)
    End Sub
    Sub addBedingungVariableIstGleich(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableEquals(Name, Wert)
    End Sub
    Sub addBedingungVariableKleiner(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableSmaller(Name, Wert)
    End Sub
    Sub addBedingungVariableGroesser(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreater(Name, Wert)
    End Sub
    Sub addBedingungVariableGroesserGleich(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreaterEqual(Name, Wert)
    End Sub
    Sub addBedinungEinheitenZahl(ByVal Einheiten As Integer, ByVal _Operator As String, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedinungEinheitenZahl(Einheiten, _Operator, Spieler)
    End Sub
    Sub addBedinungGebaeudeZahl(ByVal Gebaeude As Integer, ByVal _Operator As String, ByVal Spieler As Integer)
        Array.Resize(Bedingungen, Bedingungen.Length + 1)
        Bedingungen(Bedingungen.Length - 1) = New BedinungGebaeudeZahl(Gebaeude, _Operator, Spieler)
    End Sub

    Sub addEreignisDialog(ByVal Text As String, ByVal KOID As String, ByVal Spieler As Integer, ByVal Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck, Optional ByVal dialogMusik As String = "", Optional ByVal dialogBild As String = "")
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisDialog(Text, KOID, Spieler, Gesichtsausdruck, dialogMusik, dialogBild)
    End Sub
    Sub addEreignisEinheitErschaffen(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisEinheitErschaffen(EinheitsID, KooX, KooY, Spieler, Leben, kannZiehen)
    End Sub
    Sub addEreignisEinheitErschaffen(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean, ByVal Schlacht As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisEinheitErschaffen(EinheitsID, KooX, KooY, Spieler, Leben, kannZiehen, Schlacht)
    End Sub
    Sub addEreignisSetKP(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer, ByVal Schlachtfeld As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKP(KooX, KooY, KP, Schlachtfeld)
    End Sub
    Sub addEreignisSetKP(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKP(KooX, KooY, KP)
    End Sub
    Sub addEreignisSetKO(ByVal Spieler As Integer, ByVal KOIndex As Integer, ByVal KOID As String)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetKO(Spieler, KOIndex, KOID)
    End Sub
    Sub addEreignisSchadenswelle(ByVal Spieler As Integer, ByVal Schaden As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSchadenswelle(Spieler, Schaden)
    End Sub
    Sub addEreignisLandkarteMGewonnen(ByVal MissionsIndex As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMGewonnen(MissionsIndex)
    End Sub
    Sub addEreignisLandkarteMAuswaehlbar(ByVal MissionsIndex As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMAuswaehlbar(MissionsIndex)
    End Sub
    Sub addEreignisSieg(ByVal Team As Char)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSieg(Team)
    End Sub
    Sub addEreignisSetFeuerLadung(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerladung As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetFeuerLadung(X, Y, Schlacht, Feuerladung)
    End Sub
    Sub addEreignisAddWarteEinheit(ByVal X As Integer, ByVal Y As Integer, ByVal Spieler As Integer, Optional ByVal Schlacht As Integer = ObjektSpielfeld.Bodenschlacht)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisAddWarteEinheit(X, Y, Schlacht, Spieler)
    End Sub
    Sub addEreignisRemoveBlockierteEinheit(ByVal EinheitenID As String, ByVal Armee As String)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisRemoveBlockierteEinheit(EinheitenID, Armee)
    End Sub
    Sub addEreignisLandkarteSetZustand(ByVal Index As Integer, ByVal Zustand As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteSetZustand(Index, Zustand)
    End Sub
    Sub addEreignisSetFabrikfonds(ByVal X As Integer, ByVal Y As Integer, ByVal Fonds As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetFabrikfonds(X, Y, Fonds)
    End Sub
    Sub addEreignisSetNeutralerGebaeudeAngriff(ByVal Spieler As Integer, ByVal Angriff As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetNeutralerGebaeudeAngriff(Spieler, Angriff)
    End Sub
    Sub addEreignisSetVariable(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetVariable(Name, Wert)
    End Sub
    Sub adEreignisIncreaseVariable(ByVal Name As String, ByVal Wert As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisIncreaseVariable(Name, Wert)
    End Sub
    Sub addEreignisDefearPlayer(ByVal Spieler As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisDefearPlayer(Spieler)
    End Sub
    Sub addEreignisSetBuildingFirerange(ByVal X As Integer, ByVal Y As Integer, ByVal Reichweite As Integer, Optional ByVal Schlachfeld As Integer = -1)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetBuildingFirerange(X, Y, Reichweite, Schlachfeld)
    End Sub
    Sub addEreignisSetVulkanChance(ByVal X As Integer, ByVal Y As Integer, ByVal Chance As Single, Optional ByVal Schlachfeld As Integer = -1)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetVulkanChance(X, Y, Chance, Schlachfeld)
    End Sub
    Sub addEreignisSetBuildingDamage(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, Optional ByVal Schlachfeld As Integer = -1)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisSetBuildingDamage(X, Y, Schaden, Schlachfeld)
    End Sub
    Sub addEreignisUnHideArea(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal Hide As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisUnHideArea(X1, Y1, X2, Y2, Hide)
    End Sub
    Sub addEreignisAddVolcanTarget(ByVal X As Integer, ByVal Y As Integer, ByVal Day As Integer, ByVal TargetX As Integer, ByVal TargetY As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisAddVolcanTarget(X, Y, Day, TargetX, TargetY)
    End Sub
    Sub addEreignisClearVolcanTarget(ByVal X As Integer, ByVal Y As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisClearVolcanTarget(X, Y)
    End Sub
    Sub addEreignisCreateFog(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, ByVal Bottom As Integer, ByVal Nebel As Nebelarten, ByVal Spieler As Integer)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisCreateFog(Left, Top, Right, Bottom, Nebel, Spieler)
    End Sub
    Sub addEreignisChangeCOPowerstate(ByVal Spieler As Integer, ByVal Powerstate As Boolean)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisChangeCOPowerstate(Spieler, Powerstate)
    End Sub
    Sub addEreignisCreateCOClone(ByVal Spieler As Integer, ByVal KONumber As Integer, ByVal KOID As String, ByVal KOBild As String)
        Array.Resize(Ereignisse, Ereignisse.Length + 1)
        Ereignisse(Ereignisse.Length - 1) = New EreignisCreateCOClone(Spieler, KONumber, KOID, KOBild)
    End Sub

    ''' <summary>
    ''' Prueft, ob das Ereignis ausgeloest werden kann. Wenn ja wird es gleich ausgeloest, sofern moeglich ;)
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ScriptPruefen(ByVal Pruefstadium As Pruefstadien)

        'es gibt aber Scripts die mehrmals aufgerufen werden sollen.
        If Ausgefuehrt Then Exit Sub 'Wenn das Script schon beendet wurde, koennen wir alles so lassen wie es ist.
        Dim Loslegen As Boolean = True
        If Bedingungen.Length > 0 Then
            For Each B In Bedingungen
                If Not B.Pruefen(Pruefstadium) Then Loslegen = False 'Die Frage ist, ob eine Bedingung erfuellt sein muessen oder alle, oder etwas anderes. Also im Moment, nur die letzte Bedingung zaehlt ist noch nicht ganz so einwandfrei, aber das kann man ja bei bedarf aendern.
            Next
        End If
        If Loslegen Then
            'Das Ereignis kann ausgefuehrt werden
            LaunchScript()
            Ausgefuehrt = True
            For Each B In Bedingungen
                B.ScriptAusgefuehrt()
                If B.MehrfachVerwendung = True Then
                    Ausgefuehrt = False
                End If
            Next
        End If
    End Sub
    ''' <summary>
    ''' Startet das Script
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub LaunchScript()
        For Each E In Ereignisse
            E.Ausfuehren()
			 If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
			If Hauptmenue.Connection.Hosten then
			E.SendAction()
			end if
			end if
			end if
        Next
    End Sub

#End Region
#Region "Bedingungen"
    Public Sub ReadBedingung(ByRef StrR As Filestream)
        Select Case StrR.ReadByte
            Case 0
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungTag(0, Pruefstadien.RundenAnfang, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 1
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungTagGroesser(0, Pruefstadien.RundenAnfang, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 2
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungJedenXTag(0, Pruefstadien.RundenAnfang, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 3
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungTagKleiner(0, Pruefstadien.RundenAnfang, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 4
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungBesetzt(0, 0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 5
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungSieg("A")
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 6
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungFeuerbereit(0, 0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 7
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungNachXZuegenImmer(0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 8
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungLandkarteZustand(0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 9
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungCountLandkarteZustand(0, 0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 10
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungGebaeudeZerstoert(0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 11
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungSpielerBesiegt(0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 12
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungInBereich(New Point, New Point, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 13
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungEinheitZerstoert(0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 14
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungFeldLeer(0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 15
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungZufall(0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 16
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungVariableEquals("", 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 17
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungVariableSmaller("", 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 18
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreater("", 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 19
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedingungVariableGreaterEqual("", 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 20
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedinungEinheitenZahl(0, "", 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
            Case 21
                Array.Resize(Bedingungen, Bedingungen.Length + 1)
                Bedingungen(Bedingungen.Length - 1) = New BedinungGebaeudeZahl(0, 0, 0)
                Bedingungen(Bedingungen.Length - 1).ReadCondition(StrR)
        End Select
    End Sub
    Public MustInherit Class Bedingung
        Implements ICloneable

        Public MustOverride Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
        Public MustOverride Function MehrfachVerwendung() As Boolean
        ''' <summary>
        ''' Wird aufgerufen, wenn wir dieses Script ausgefuehrt haben
        ''' </summary>
        ''' <remarks></remarks>
        Public Overridable Sub ScriptAusgefuehrt()

        End Sub
        Public MustOverride Sub Write(ByRef StrW As Filestream)
        Public MustOverride Sub ReadCondition(ByRef StrR As Filestream)
        Public MustOverride Function Clone() As Object Implements System.ICloneable.Clone
    End Class
    ''' <summary>
    ''' Die Bedingung ist dieser Tag muss es sein.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungTag
        Inherits Bedingung



        Dim Tag, Spieler As Integer
        Dim Rundenanfang As Pruefstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgeloest wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgeloest werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgeloest werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Pruefstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.Rundenanfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde = Tag Then

                    Return Pruefstadium = Me.Rundenanfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfuellt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Rundenanfang = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Tag = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(0)
            StrW.WriteByte(Rundenanfang)
            Dim B(3) As Byte
            B = IntToBytes(Tag)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub

        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
    End Class
    ''' <summary>
    ''' Die Bedingung ist der Tag muss groesser sein wie.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungTagGroesser
        Inherits Bedingung


        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Pruefstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgeloest wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgeloest werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgeloest werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Pruefstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde > Tag Then
                    Return Pruefstadium = Me.RundenAnfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfuellt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            RundenAnfang = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Tag = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(1)
            StrW.WriteByte(RundenAnfang)
            Dim B(3) As Byte
            B = IntToBytes(Tag)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Die Bedingung ist jedes vielfache des Tages.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungJedenXTag
        Inherits Bedingung
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Pruefstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgeloest wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgeloest werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgeloest werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Pruefstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                Dim R As Integer = -1
                Math.DivRem(Objektverwalter.Spielfeld.Runde, Tag, R)
                If R = 0 Then
                    Return Me.RundenAnfang = Pruefstadium
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfuellt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            RundenAnfang = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Tag = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(2)
            StrW.WriteByte(RundenAnfang)
            Dim B(3) As Byte
            B = IntToBytes(Tag)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Die Bedingung ist der Tag muss kleiner sein wie.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungTagKleiner
        Inherits Bedingung
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Dim Tag, Spieler As Integer
        Dim RundenAnfang As Pruefstadien
        ''' <summary>
        ''' Setzt die Bedingung, das das Ereignis ausgeloest wird, wenn ein bestimmter Tag anbricht
        ''' </summary>
        ''' <param name="Tag">Der wievielte Tag</param>
        ''' <param name="Rundenanfang">Ob das Ereignis am Anfang des Zuges des Spielers, oder am Zugende ausgeloest werden soll.</param>
        ''' <param name="Spieler">Beim wievielten Spieler das Ereignis ausgeloest werden soll.</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal Tag As Integer, ByVal Rundenanfang As Pruefstadien, ByVal Spieler As Integer)
            Me.Tag = Tag
            Me.RundenAnfang = Rundenanfang
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.AktuellerSpieler.Spieler = Spieler Then
                If Objektverwalter.Spielfeld.Runde < Tag Then
                    Return Pruefstadium = Me.RundenAnfang
                End If
            End If
            Return False 'Generell sind die Bedingungen nicht erfuellt.
        End Function

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            RundenAnfang = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Tag = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(3)
            StrW.WriteByte(RundenAnfang)
            Dim B(3) As Byte
            B = IntToBytes(Tag)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Die Bedingung, das ein Gebaeude auf bestimmten Koordinaten einem bestimmten Spieler gehoert.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungBesetzt
        Inherits Bedingung
        Dim KooX, KooY, Spieler, Schlacht As Integer
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <param name="KooX"></param>
        ''' <param name="KooY"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Schlacht">Normalerweise 0=Bodenschlacht, denn in den Wolken sind nicht uebermaessig viele Gebaeude zu finden. Allerdings ist auch -1, wie bei den anderen moeglich, fuer das Aktuelle Schlachtfeld</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, Optional ByVal Schlacht As Integer = 0)
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Spieler = Spieler
            Me.Schlacht = Schlacht
        End Sub


        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            'Naja hier spielt das Pruefstadium wohl keine grosse Rolle
            If Schlacht = -1 Then Schlacht = Objektverwalter.Spielfeld.MomentaneSchlacht
            If Not IsNothing(Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlacht).Gebaeude) Then
                If Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlacht).Gebaeude.Spieler = Spieler Then
                    Return True
                End If
            End If
            Return False
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooX = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooY = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(4)
            Dim B(3) As Byte
            B = IntToBytes(KooX)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KooY)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist wir haben gewonnen
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungSieg
        Inherits Bedingung
        Dim Team As Char

        Public Sub New(ByVal Team As Char)
            Me.Team = Team
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim gewonnen As Boolean = True
            For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                    If Not Objektverwalter.Spielfeld.Regeln.Besiegt(I) Then
                        gewonnen = False
                    End If
                Else
                End If
            Next

            Return gewonnen
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Team = ByteToChar(StrR.ReadByte)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(5)
            Dim B As Byte
            B = CharToByte(Team)
            StrW.WriteByte(B)
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das Gebaeude hat eine gewisse Feuerzahl
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungFeuerbereit
        Inherits Bedingung
        Dim X, Y, Feuerzahl, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Feuerzahl As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Feuerzahl = Feuerzahl
        End Sub
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Feuerzahl As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = ObjektSpielfeld.Bodenschlacht
            Me.Feuerzahl = Feuerzahl
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Pruefstadium = Pruefstadien.RundenMitte Then
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude
                If Not G Is Nothing Then
                    G = Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlacht).Gebaeude
                    If G.Feuerbereit = Feuerzahl Then
                        Return True
                    Else
                        Return False
                    End If
                End If
            End If
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Feuerzahl = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(6)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Feuerzahl)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist wir sind N-Tage nach dem letzten ausfuehren.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungNachXZuegenImmer
        Inherits Bedingung
        Dim Tage, LetzterTag As Integer
        Dim Pruefstadium As Pruefstadien
        Public Sub New(ByVal Tage As Integer, ByVal StartTag As Integer, ByVal Pruefstadium As Pruefstadien)
            Me.Tage = Tage
            LetzterTag = StartTag
            Me.Pruefstadium = Pruefstadium
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Me.Pruefstadium = Pruefstadium Then
                If Objektverwalter.Spielfeld.Runde >= LetzterTag + Tage Then
                    Return True
                End If
            End If
        End Function
        Public Overrides Sub ScriptAusgefuehrt()
            LetzterTag = Objektverwalter.Spielfeld.Runde
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Pruefstadium = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Tage = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            LetzterTag = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(7)
            StrW.WriteByte(Pruefstadium)
            Dim B(3) As Byte
            B = IntToBytes(Tage)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(LetzterTag)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist wir sind N-Tage nach dem letzten ausfuehren.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungLandkarteZustand
        Inherits Bedingung
        Dim Karte As Integer
        Dim Zustand As Mission.MissionsZustaende
        Public Sub New(ByVal Karte As Integer, ByVal Zustand As Mission.MissionsZustaende)
            Me.Karte = Karte
            Me.Zustand = Zustand
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Karte).MissionsZustand = Zustand Then
                Return True
            End If
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Zustand = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Karte = BytesToInt(B)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(8)
            StrW.WriteByte(Zustand)
            Dim B(3) As Byte
            B = IntToBytes(Karte)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist von diesen Karten haben n.den Zustand
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungCountLandkarteZustand
        Inherits Bedingung
        Dim StartKarte, Endkarte, Count As Integer
        Dim Zustand As Mission.MissionsZustaende
        Public Sub New(ByVal StartKarte As Integer, ByVal Endkarte As Integer, ByVal Count As Integer, ByVal Zustand As Mission.MissionsZustaende)
            Me.StartKarte = StartKarte
            Me.Endkarte = Endkarte
            Me.Zustand = Zustand
            Me.Count = Count
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim C As Integer = 0
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                For I = StartKarte To Endkarte
                    If Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(I).MissionsZustand = Zustand Then
                        C += 1
                        If C >= Count Then
                            Return True
                        End If
                    End If
                Next
            End If
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Zustand = StrR.ReadByte
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            StartKarte = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Endkarte = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Count = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(9)
            StrW.WriteByte(Zustand)
            Dim B(3) As Byte
            B = IntToBytes(StartKarte)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Endkarte)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Count)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das Gebaeude dort muss Zerstoert sein.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungGebaeudeZerstoert
        Inherits Bedingung
        Dim X, Y, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude
            If G IsNot Nothing Then
                G = Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlacht).Gebaeude
                If G.GetKP(X, Y, True) <= 0 Then
                    Return True
                End If
            Else
                If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Leben <= 0 Then
                    Return True
                End If
            End If
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(10)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das ein Spieler besiegt ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungSpielerBesiegt
        Inherits Bedingung
        Dim Spieler As Integer
        Public Sub New(ByVal Spieler As Integer)
            Me.Spieler = Spieler
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Return Objektverwalter.Spielfeld.Regeln.IstBesiegt(Spieler)
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(11)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das eine Einheit dieses Spielers in diesem Gebiet ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungInBereich
        Inherits Bedingung
        Dim P1, P2 As Point
        Dim Spieler As Integer
        Dim Schlacht As Integer
        Public Sub New(ByVal P1 As Point, ByVal P2 As Point, ByVal Spieler As Integer, ByVal Schlacht As Integer)
            Me.P1 = P1
            Me.P2 = P2
            Me.Spieler = Spieler
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Pruefstadium = Pruefstadien.RundenMitte Then
                Dim Startschlacht As Integer = Schlacht
                Dim Endschlacht As Integer = Schlacht
                If Schlacht < 0 Then
                    Startschlacht = 0
                    If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
                        Endschlacht = 1
                    Else
                        Endschlacht = 0
                    End If
                End If
                For I = Startschlacht To Endschlacht
                    For X = P1.X To P2.X
                        For Y = P1.Y To P2.Y
                            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                            If Not E Is Nothing Then
                                If E.Spieler = Spieler Then
                                    Return True
                                End If
                            End If
                        Next
                    Next
                Next
            End If
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            P1.X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            P1.Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            P2.X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            P2.Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(12)
            Dim B(3) As Byte
            B = IntToBytes(P1.X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(P1.Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(P2.X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(P2.Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das eine Einheit dieses Spielers in diesem Gebiet ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungEinheitZerstoert
        Inherits Bedingung
        Public Einheit As ObjektEinheit
        Public X, Y, Schlacht As Integer
        Dim Deaktiviert As Boolean = True
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            If Objektverwalter.Spielfeld Is Nothing Then
                Me.X = X
                Me.Y = Y
                Me.Schlacht = Schlacht
            Else
                Einheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
            End If
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Deaktiviert = True And Einheit Is Nothing Then
                Einheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                If Einheit Is Nothing Then
                    Deaktiviert = True
                Else
                    Deaktiviert = False
                    Return Pruefen
                End If
            ElseIf Deaktiviert = False Then
                Return Pruefen
            End If
        End Function
        Public Overloads Function Pruefen() As Boolean
            X = Einheit.X
            Y = Einheit.Y
            Schlacht = Einheit.GetMap
            If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) IsNot Nothing Then
                If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Equals(Einheit) Then
                    Return False
                End If
            End If
            For Each Unit In Objektverwalter.Spielfeld.Einheiten
                If Not Unit Is Nothing Then
                    If Unit.Equals(Einheit) Then
                        Return False
                    Else
                        For Each Ladung In Unit.Ladung
                            If Ladung IsNot Nothing Then
                                If Ladung.Equals(Einheit) Then
                                    Return False
                                End If
                            End If
                        Next
                    End If
                End If
            Next
            If Einheit IsNot Nothing Then
                Einheit = Nothing
                Return True
            End If
        End Function
        Public Overrides Function Clone() As Object
            Dim K As BedingungEinheitZerstoert = MemberwiseClone()
            K.X = Einheit.X
            K.Y = Einheit.Y
            K.Schlacht = Einheit.Battlemap
            K.Einheit = Nothing
            Return K
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(13)
            Dim B(3) As Byte
            If Einheit Is Nothing Then
                B = IntToBytes(X)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
                B = IntToBytes(Y)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
                B = IntToBytes(Schlacht)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
            Else
                B = IntToBytes(Einheit.X)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
                B = IntToBytes(Einheit.Y)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
                B = IntToBytes(Einheit.GetMap)
                For I = 0 To B.Length - 1
                    StrW.WriteByte(B(I))
                Next
            End If
        End Sub
    End Class
    ''' <summary>
    ''' Bedingung ist das das Feld leer ist
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungFeldLeer
        Inherits Bedingung
        Dim X, Y, Schlacht As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) Is Nothing Then
                If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude Is Nothing Then
                    Return True
                ElseIf Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude.GetKP(X, Y, True) <= 0 Then
                    Return True
                End If
            End If
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(14)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next

        End Sub
    End Class
    ''' <summary>
    ''' This Condition will work at Random!
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BedingungZufall
        Inherits Bedingung
        Dim Wahrscheinlichkeit As Integer
        Public Sub New(ByVal Wahrscheinlichkeit As Integer)
            Me.Wahrscheinlichkeit = Wahrscheinlichkeit
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim R As Integer = Zufallszahl(1, 100)
            If Wahrscheinlichkeit <= R Then
                Return True
            End If
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Wahrscheinlichkeit = BytesToInt(B)

        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(15)
            Dim B(3) As Byte
            B = IntToBytes(Wahrscheinlichkeit)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class BedingungVariableEquals
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim V As GebaeudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert = VariablenWert Then
                Return True
            End If
            Return False
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            VariablenWert = BytesToInt(B)
            VariablenName = ReadString(StrR)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(16)
            Dim B(3) As Byte
            B = IntToBytes(VariablenWert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, VariablenName)
        End Sub
    End Class
    Public Class BedingungVariableSmaller
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim V As GebaeudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert < VariablenWert Then
                Return True
            End If
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            VariablenWert = BytesToInt(B)
            VariablenName = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(17)
            Dim B(3) As Byte
            B = IntToBytes(VariablenWert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, VariablenName)
        End Sub
    End Class
    Public Class BedingungVariableGreater
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim V As GebaeudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert > VariablenWert Then
                Return True
            End If
            Return False
        End Function

        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            VariablenWert = BytesToInt(B)
            VariablenName = ReadString(StrR)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(18)
            Dim B(3) As Byte
            B = IntToBytes(VariablenWert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, VariablenName)
        End Sub
    End Class
    Public Class BedingungVariableGreaterEqual
        Inherits Bedingung
        Dim VariablenName As String
        Dim VariablenWert As Integer
        Public Sub New(ByVal VariablenName As String, ByVal VariablenWert As Integer)
            Me.VariablenName = VariablenName
            Me.VariablenWert = VariablenWert
        End Sub
        Public Overrides Function MehrfachVerwendung() As Boolean
            Return True
        End Function
        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim V As GebaeudeFabrik.Variable = GetVariable(VariablenName)
            If V.Wert >= VariablenWert Then
                Return True
            End If
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            VariablenWert = BytesToInt(B)
            VariablenName = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(19)
            Dim B(3) As Byte
            B = IntToBytes(VariablenWert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, VariablenName)
        End Sub
    End Class
    Public Class BedinungEinheitenZahl
        Inherits Bedingung
        Dim Einheiten As Integer
        Dim _Operator As String
        Dim Spieler As Integer
        Public Sub New(ByVal Einheiten As Integer, ByVal _Operator As String, ByVal Spieler As Integer)
            Me.Einheiten = Einheiten
            Me._Operator = _Operator
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim Units As Integer = 0
            For Each Unit In Objektverwalter.Spielfeld.Einheiten
                If Not Objektverwalter.Spielfeld.Landschaften(Unit.X, Unit.Y, Unit.GetMap).Hidden Then
                    If Unit.Spieler = Spieler Then
                        Units += 1
                    End If
                End If
            Next
            Select Case _Operator
                Case ">="
                    If Einheiten >= Units Then
                        Return True
                    End If
                Case "<="
                    If Einheiten <= Units Then
                        Return True
                    End If
                Case ">"
                    If Einheiten > Units Then
                        Return True
                    End If
                Case "<"
                    If Einheiten < Units Then
                        Return True
                    End If
                Case Else
                    If Einheiten = Units Then
                        Return True
                    End If
            End Select
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Einheiten = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            _Operator = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(20)
            Dim B(3) As Byte
            B = IntToBytes(Einheiten)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, _Operator)
        End Sub
    End Class
    Public Class BedinungGebaeudeZahl
        Inherits Bedingung
        Dim Gebaeude As Integer
        Dim _Operator As String
        Dim Spieler As Integer
        Public Sub New(ByVal Gebaeude As Integer, ByVal _Operator As String, ByVal Spieler As Integer)
            Me.Gebaeude = Gebaeude
            Me._Operator = _Operator
            Me.Spieler = Spieler
        End Sub

        Public Overrides Function MehrfachVerwendung() As Boolean
            Return False
        End Function

        Public Overrides Function Pruefen(ByVal Pruefstadium As Pruefstadien) As Boolean
            Dim Gebaeude As Integer = 0
            For Each L In Objektverwalter.Spielfeld.Landschaften
                If Not L.Hidden Then
                    Dim G As ObjektGebaeude = L.Gebaeude
                    If G IsNot Nothing Then
                        If G.GetRealGebaeudeID <> "Verweis" Then
                            If G.Spieler = Spieler Then
                                Gebaeude += 1
                            End If
                        End If
                    End If
                End If
            Next
            Select Case _Operator
                Case ">="
                    If Gebaeude >= Me.Gebaeude Then
                        Return True
                    End If
                Case "<="
                    If Gebaeude <= Me.Gebaeude Then
                        Return True
                    End If
                Case ">"
                    If Gebaeude > Me.Gebaeude Then
                        Return True
                    End If
                Case "<"
                    If Gebaeude < Me.Gebaeude Then
                        Return True
                    End If
                Case Else
                    If Gebaeude = Me.Gebaeude Then
                        Return True
                    End If
            End Select
            Return False
        End Function
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub ReadCondition(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Gebaeude = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            _Operator = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(20)
            Dim B(3) As Byte
            B = IntToBytes(Gebaeude)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, _Operator)
        End Sub
    End Class
#End Region
#Region "Ereignisse"
    Public Sub ReadEreignis(ByRef StrR As Filestream)
        Select Case StrR.ReadByte
            Case 0
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisDialog("", "", 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 1
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisEinheitErschaffen("", 0, 0, 0, 0, False)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 2
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetKP(0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 3
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetKO(0, 0, "")
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 4
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSieg("")
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 5
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMGewonnen(0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 6
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteMAuswaehlbar(0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 7
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSchadenswelle(0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 8
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetFeuerLadung(0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 9
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisAddWarteEinheit(0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 10
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisRemoveBlockierteEinheit("", "")
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 11
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisLandkarteSetZustand(0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 12
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetFabrikfonds(0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 13
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetNeutralerGebaeudeAngriff(0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 14
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisNewVariable("", 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 15
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetVariable("", 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 16
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetVariable("", 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 17
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisDefearPlayer(0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 18
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetBuildingFirerange(0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 19
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetVulkanChance(0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 20
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisSetBuildingDamage(0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 21
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisUnHideArea(0, 0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 22
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisAddVolcanTarget(0, 0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 23
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisClearVolcanTarget(0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 24
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisCreateFog(0, 0, 0, 0, 0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 25
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisChangeCOPowerstate(0, 0)
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
            Case 26
                Array.Resize(Ereignisse, Ereignisse.Length + 1)
                Ereignisse(Ereignisse.Length - 1) = New EreignisCreateCOClone(0, 0, "", "")
                Ereignisse(Ereignisse.Length - 1).Read(StrR)
        End Select
    End Sub
    Public MustInherit Class Ereignis
        Implements ICloneable
        Public MustOverride Sub Ausfuehren()
        Public MustOverride Sub Write(ByRef StrW As Filestream)
        Public MustOverride Sub Read(ByRef StrR As Filestream)
        Public MustOverride Function Clone() As Object Implements System.ICloneable.Clone
		'Send the Action done to the Clients.... Nice
        Public Overridable Sub SendAction()

        End Sub
    End Class
    Public Class EreignisDialog
        Inherits Ereignis
        Public Text, KOID As String
        Public Musik, Bild As String
        Public Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck
        Public Spieler As Integer
        Sub New(ByVal Text As String, ByVal KOID As String, ByVal Spieler As Integer, ByVal Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck, Optional ByVal dialogMusik As String = "", Optional ByVal dialogBild As String = "")
            Me.Text = Text
            Me.KOID = KOID
            Me.Gesichtsausdruck = Gesichtsausdruck
            Me.Spieler = Spieler
            Musik = dialogMusik
            Bild = dialogBild
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Show Dialogue.")
            End If
            If KOID.ToLower = "spieler".ToLower Then 'Der Aktuelle erste KO des Spielers soll sprechen.
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
            Else 'Ein vordefinierter KO soll sprechen.
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(KOID, Text, Spieler, Gesichtsausdruck, , Musik, Bild)}) 'Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiss hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|Dialog|" + Text + "|" + KOID + "|" + Musik + "|" + Bild + "|" + CInt(Gesichtsausdruck).ToString + "|" + Spieler.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Gesichtsausdruck = StrR.ReadByte()
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            Text = ReadString(StrR)
            KOID = ReadString(StrR)
            Musik = ReadString(StrR)
            Bild = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(0)
            StrW.WriteByte(Gesichtsausdruck)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, Text)
            WriteString(StrW, KOID)
            WriteString(StrW, Musik)
            WriteString(StrW, Bild)
        End Sub
    End Class
    ''' <summary>
    ''' Im Moment wird nur Brutal eine Einheit erschaffen, egal welche Konsequenzen es nach sich zieht. Spaeter kann man hier noch irgendein Boolean mitgeben, mit dem man vlt. auf's naechste Feld ausweicht, wenn hier schon jemand steht oder so.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class EreignisEinheitErschaffen
        Inherits Ereignis
        Dim KooX, KooY, Spieler, Leben, Schlacht As Integer
        Dim EinheitsID As String
        Dim kannZiehen As Boolean
        ''' <summary>
        ''' Setzt die Startwerte.
        ''' </summary>
        ''' <param name="EinheitsID"></param>
        ''' <param name="KooX"></param>
        ''' <param name="KooY"></param>
        ''' <param name="Spieler"></param>
        ''' <param name="Leben">0-100</param>
        ''' <param name="kannZiehen"></param>
        ''' <remarks></remarks>
        Sub New(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean)
            Me.Spieler = Spieler
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Leben = Leben
            Me.EinheitsID = EinheitsID
            Me.kannZiehen = kannZiehen
            Me.Schlacht = -1
        End Sub
        Sub New(ByVal EinheitsID As String, ByVal KooX As Integer, ByVal KooY As Integer, ByVal Spieler As Integer, ByVal Leben As Integer, ByVal kannZiehen As Boolean, ByVal Schlacht As Integer)
            Me.Spieler = Spieler
            Me.KooX = KooX
            Me.KooY = KooY
            Me.Leben = Leben
            Me.EinheitsID = EinheitsID
            Me.kannZiehen = kannZiehen
            Me.Schlacht = Schlacht
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Spawn Unit ID=" + EinheitsID + " at X=" + KooX.ToString + " ; Y=" + KooY.ToString + " with " + Leben.ToString + " HP.")
            End If
            If Schlacht = -1 Then Schlacht = Objektverwalter.Spielfeld.MomentaneSchlacht
            Objektverwalter.Spielfeld.PlaceUnit(ObjektLadeklasse.NewEinheit(EinheitsID, Spieler, KooX, KooY, Leben, Not kannZiehen), KooX, KooY, Schlacht)
					
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|CreateUnit|" + KooX.ToString + "|" + KooY.ToString + "|" + Schlacht.ToString + "|" + Spieler.ToString + "|" + Leben.ToString + "|" + EinheitsID + "|" + kannZiehen.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            kannZiehen = StrR.ReadByte()
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooX = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooY = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Leben = BytesToInt(B)
            EinheitsID = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(1)
            StrW.WriteByte(kannZiehen)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KooX)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KooY)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Leben)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, EinheitsID)
        End Sub
    End Class
    ''' <summary>
    ''' Setzt die KP einer Einheit eines Gebaeudes oder einer Landschaft fest, je nach dem welche Einheit auf diesem Feld ist.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class EreignisSetKP
        Inherits Ereignis
        Dim KooX, KooY, KP, Schlachtfeld As Integer

        Sub New(ByVal KooX As Integer, ByVal KooY As Integer, ByVal KP As Integer, Optional ByVal Schlachtfeld As Integer = -1)
            Me.KooX = KooX
            Me.KooY = KooY
            Me.KP = KP
            Me.Schlachtfeld = Schlachtfeld
        End Sub
        Public Overrides Sub Ausfuehren()
            If Schlachtfeld = -1 Then Schlachtfeld = Objektverwalter.Spielfeld.MomentaneSchlacht
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Unit\Building HP to " + KP.ToString + " at X=" + KooX.ToString + " ; Y=" + KooY.ToString)
            End If
            If Not IsNothing(Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld)) Then  'Nur zur sicherheit, wenn man sich mit einem Script auf eine Position bezieht, kann man sich natuerlich sicher sein, dass dort jemand ist, muss es aber nicht.
                Objektverwalter.Spielfeld.Einheiten(KooX, KooY, Schlachtfeld).SetKP(KP)
            ElseIf Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Leben > 0 Then
                Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).SetLeben(KP)
            Else
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(KooX, KooY, Schlachtfeld).Gebaeude
                If Not G Is Nothing Then
                    If G.GetKP(KooX, KooY, True) > 0 Then
                        G.KP = KP
                    End If
                End If
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|SetHP|" + KooX.ToString + "|" + KooY.ToString + "|" + Schlachtfeld.ToString + "|" + KP.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooX = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KooY = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlachtfeld = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KP = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(2)
            Dim B(3) As Byte
            B = IntToBytes(KooX)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KooY)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlachtfeld)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KP)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetKO
        Inherits Ereignis
        Dim Spieler, KOIndex As Integer
        Dim KOID As String

        Sub New(ByVal Spieler As Integer, ByVal KOIndex As Integer, ByVal KOID As String)
            Me.Spieler = Spieler
            Me.KOID = KOID
            Me.KOIndex = KOIndex
            If KOIndex < 0 Then KOIndex = 0
            If KOIndex > 1 Then KOIndex = 1
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set KO " + KOIndex + " of Player " + Spieler.ToString + " to KOID=" + KOID)
            End If
            If KOID = "-" Then
                If KOIndex = 1 Then Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = Nothing
            Else
                Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KOIndex) = ObjektLadeklasse.NewKO(KOID, Spieler)
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|SetCO|" + Spieler.ToString + "|" + KOIndex.ToString + "|" + KOID))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KOIndex = BytesToInt(B)
            KOID = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(3)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KOIndex)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, KOID)
        End Sub
    End Class
    ''' <summary>
    ''' Laesst ein Team gewinnen.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class EreignisSieg
        Inherits Ereignis
        Dim Team As Char
        Public Sub New(ByVal Team As Char)
            Me.Team = Team
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Team " + Team + "wins.")
            End If
            For I = 0 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                    Objektverwalter.Spielfeld.Regeln.Besiegt(I) = True
                Else
                    Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False
                End If
            Next
            Objektverwalter.Spielfeld.Regeln.CheckSieg()
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|Victory|" + Team))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Team = ByteToChar(StrR.ReadByte)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(4)
            StrW.WriteByte(CharToByte(Team))
        End Sub
    End Class
    Public Class EreignisLandkarteMGewonnen
        Inherits Ereignis
        Dim Ind As Integer

        Sub New(ByVal MissionsIndex As Integer)
            Ind = MissionsIndex
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Mission Number " + Ind.ToString + " to won.")
            End If
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
				if Ind >= 0 and Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.length then
					Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandGewonnen()
				end if
            End If
        End Sub
		Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|WinWorldmapMap|" + Ind.tostring))
        End Sub
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Ind = BytesToInt(B)
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(5)
            Dim B(3) As Byte
            B = IntToBytes(Ind)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisLandkarteMAuswaehlbar
        Inherits Ereignis
        Dim Ind As Integer

        Sub New(ByVal MissionsIndex As Integer)
            Ind = MissionsIndex
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Mission Number " + Ind.ToString + " to selectable.")
            End If
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
				if Ind >= 0 and Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.length then
					Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).ZustandAuswaehlbar()
				end if
            End If
        End Sub
		Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|SelectableWorldmapMap|" + Ind.tostring))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Ind = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(6)
            Dim B(3) As Byte
            B = IntToBytes(Ind)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSchadenswelle
        Inherits Ereignis
        Dim Spieler, Wirkung As Integer

        ''' <summary>
        ''' Laesst eine Schadenswelle wie bei Olaf, Drake, Maverik usw. entstehen
        ''' </summary>
        ''' <param name="Spieler">von welchem Spieler die Welle ausgeht, alle dessen Feinde werden beschaedigt.</param>
        ''' <param name="Schaden">Wieviel Schaden gemacht wird - in Leben(1-9)</param>
        ''' <remarks></remarks>
        Sub New(ByVal Spieler As Integer, ByVal Schaden As Integer)
            Wirkung = Schaden
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausfuehren()
            Schadenswelle(Objektverwalter.Spielfeld.Spieler(Spieler).Team, Wirkung)
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|DamageWave|" + Spieler.ToString + "|" + Wirkung.ToString))
        End Sub
        Public Shared Sub Schadenswelle(ByVal Team As Char, ByVal neuSchaden As Integer)
            If Konsole.ShowScript Then
                Konsole.Write("Script: Create Damage Wave for Team " + Team + "with " + neuSchaden.ToString + " of Damage.")
            End If
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler).Team = Team Then
                                Schaden(X, Y, neuSchaden, I)
                            End If
                        End If
                    Next
                Next
            Next
        End Sub
        ''' <summary>
        ''' Fuegt einer Einheit Schaden zu
        ''' </summary>
        ''' <param name="X"></param>
        ''' <param name="Y"></param>
        ''' <param name="Schaden"></param>
        ''' <remarks></remarks>
        Protected Shared Sub Schaden(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, ByVal Schlacht As Integer)
            Dim NeuesLeben As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
            NeuesLeben *= 10
            If NeuesLeben > 100 Then
                NeuesLeben = 100
            ElseIf NeuesLeben <= 0 Then
                NeuesLeben = 1
            End If
            Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Leben = NeuesLeben
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Wirkung = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(7)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Wirkung)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetFeuerLadung
        Inherits Ereignis
        Dim X, Y, Schlacht, Feuerladung As Integer
        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Feuerladung As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Feuerladung = Feuerladung
        End Sub
        Public Overrides Sub Ausfuehren()
            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlacht).Gebaeude
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Building at X=" + X.ToString + " ; Y=" + Y.ToString + " ; " + Feuerladung.ToString + " Rounds to wait for next Fire action")
            End If
            If Not G Is Nothing Then
                G = Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlacht).Gebaeude
                G.SetFeuerbereit(Feuerladung)
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|SetFireCounter|" + X.ToString + "|" + Y.ToString + "|" + Schlacht.ToString + "|" + Feuerladung.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Feuerladung = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(8)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Feuerladung)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisAddWarteEinheit
        Inherits Ereignis
        Dim X, Y, Schlacht, Spieler As Integer
        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Spieler As Integer)
            Me.X = X
            Me.Y = Y
            Me.Schlacht = Schlacht
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Add Unit at X=" + X.ToString + " ; Y=" + Y.ToString + " to AI wait for Attack.")
            End If
            If Objektverwalter.Spielfeld.OnMap(X, Y) Then
                If Schlacht = 0 Or Schlacht = 1 Then
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)
                    If Not E Is Nothing Then
                        If Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                            Objektverwalter.Spielfeld.Spieler(E.Spieler).AddExternGezogeneEinheit(0, 0, E, ObjektSpieler.ExternGezogeneEinheit.Befehle.WartenBisAngriff, "", ObjektSpieler.ExternGezogeneEinheit.NaechsteBefehle.Entfernen)
                        End If
                    End If
                End If
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|AddWaitUnit|" + X.ToString + "|" + Y.ToString + "|" + Schlacht.ToString + "|" + Spieler.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlacht = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(9)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlacht)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisRemoveBlockierteEinheit
        Inherits Ereignis
        Dim EinheitenID, Armee As String
        Sub New(ByVal EinheitenID As String, ByVal Armee As String)
            Me.EinheitenID = EinheitenID
            Me.Armee = Armee
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Allows Army " + Armee + " to build Unit ID " + EinheitenID)
            End If
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
                Objektverwalter.Spielfeld.ObjektLandkartenInfo.RemoveBlockierteEinheit(EinheitenID, Armee)
            End If
        End Sub
		 Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|RemoveLockedUnit|" + EinheitenID + "|" + Armee))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            EinheitenID = ReadString(StrR)
            Armee = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(10)
            WriteString(StrW, EinheitenID)
            WriteString(StrW, Armee)
        End Sub
    End Class
    Public Class EreignisLandkarteSetZustand
        Inherits Ereignis
        Dim Ind As Integer
        Dim Zustand As Mission.MissionsZustaende

        Sub New(ByVal MissionsIndex As Integer, ByVal Zustand As Integer)
            Ind = MissionsIndex
            Me.Zustand = Zustand
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Mission " + Ind + " to " + Zustand.ToString)
            End If
            If Objektverwalter.Spielfeld.ObjektLandkartenInfo IsNot Nothing Then
			if Ind>=0 and Ind < Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen.length
					Objektverwalter.Spielfeld.ObjektLandkartenInfo.Missionen(Ind).MissionsZustand = Zustand
				end if
            End If
        End Sub
		Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|SetWorldmapMap|" + Ind.tostring + "|" + cint(Zustand).tostring))
        End Sub
		
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            Zustand = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Ind = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(11)
            StrW.WriteByte(Zustand)
            Dim B(3) As Byte
            B = IntToBytes(Ind)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetFabrikfonds
        Inherits Ereignis
        Dim X, Y, Fonds As Integer

        Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Fonds As Integer)
            Me.X = X
            Me.Y = Y
            Me.Fonds = Fonds
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Fonds of Factory at X=" + X.ToString + " ; Y=" + Y.ToString + " to " + Fonds.ToString)
            End If
            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude

            If Not G Is Nothing Then
                G = Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                If TypeOf G Is GebaeudeFabrik Then
                    Dim Fabrik As GebaeudeFabrik = G
                    Fabrik.Variablen(1).Wert = Fonds - Objektverwalter.Spielfeld.Spieler(Fabrik.Spieler).Fabrikfonds
                End If
            End If
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Fonds = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(12)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Fonds)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetNeutralerGebaeudeAngriff
        Inherits Ereignis
        Dim Spieler As Integer
        Dim Wert As Boolean
        Sub New(ByVal Spieler As Integer, ByVal Wert As Boolean)
            Me.Spieler = Spieler
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Allows AI Player " + Spieler.ToString + " to attack Pipes and Meteors...")
            End If
            If Spieler <= 0 Then
                For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                    Objektverwalter.Spielfeld.Spieler(I).NeutraleGebaeudeAngriff = Wert
                Next
            ElseIf Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                Objektverwalter.Spielfeld.Spieler(Spieler).NeutraleGebaeudeAngriff = Wert
            End If
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function

        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            Wert = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(13)
            StrW.WriteByte(Wert)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisNewVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As String, ByVal Wert As Integer)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Create Variable " + Name + " with start value=" + Wert.ToString)
            End If
            Variablen.Add(New GebaeudeFabrik.Variable(Name, Wert))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Wert = BytesToInt(B)
            Name = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(14)
            Dim B(3) As Byte
            B = IntToBytes(Wert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, Name)
        End Sub
    End Class
    Public Class EreignisIncreaseVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As String, ByVal Wert As Integer)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausfuehren()

            For I = 0 To Variablen.Count - 1
                If Variablen(I).Name = Name Then
                    Dim V As GebaeudeFabrik.Variable = Variablen(I)
                    If Konsole.ShowScript Then
                        Konsole.Write("Script: Add Value=" + Wert.ToString + " to Variable " + Name + " with current Value=" + V.Wert.ToString)
                    End If
                    V.Wert = V.Wert + Wert
                    Variablen(I) = V
                End If
            Next
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Wert = BytesToInt(B)
            Name = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(15)
            Dim B(3) As Byte
            B = IntToBytes(Wert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, Name)
        End Sub
    End Class
    Public Class EreignisSetVariable
        Inherits Ereignis
        Dim Name As String
        Dim Wert As Integer
        Sub New(ByVal Name As String, ByVal Wert As Integer)
            Me.Name = Name
            Me.Wert = Wert
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Variable " + Name + "Value=" + Wert.ToString)
            End If
            For I = 0 To Variablen.Count - 1
                If Variablen(I).Name = Name Then
                    Dim V As GebaeudeFabrik.Variable = Variablen(I)
                    V.Wert = Wert
                    Variablen(I) = V
                End If
            Next
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Wert = BytesToInt(B)
            Name = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(16)
            Dim B(3) As Byte
            B = IntToBytes(Wert)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, Name)
        End Sub
    End Class
    Public Class EreignisDefearPlayer
        Inherits Ereignis
        Dim Spieler As Integer
        Public Sub New(ByVal Spieler As Integer)
            Me.Spieler = Spieler
        End Sub
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Defeat Player " + Spieler.ToString)
            End If
            If Spieler < Objektverwalter.Spielfeld.Regeln.Besiegt.Length And Spieler > 0 Then
                Objektverwalter.Spielfeld.Regeln.Besiegt(Spieler) = True
            End If
            Objektverwalter.Spielfeld.Regeln.CheckSieg()
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|DefeatPlayer|" + Spieler.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(17)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetBuildingFirerange
        Inherits Ereignis
        Dim Reichweite As Integer
        Dim X As Integer
        Dim Y As Integer
        Dim Schlachtfeld As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Reichweite As Integer, Optional ByVal Schlachtfeld As Integer = -1)
            Me.X = X
            Me.Y = Y
            Me.Reichweite = Reichweite
            Me.Schlachtfeld = Schlachtfeld
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Firerange of Building at X=" + X.ToString + " ; Y=" + Y.ToString + " to Distance=" + Reichweite.ToString)
            End If
            If Schlachtfeld < 0 Then Schlachtfeld = ObjektSpielfeld.Bodenschlacht
            If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude IsNot Nothing Then
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude
                If Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlachtfeld).Gebaeude.Reichweite > 0 Then
                    Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlachtfeld).Gebaeude.Reichweite = Reichweite
                End If
            End If
        End Sub

        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlachtfeld = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Reichweite = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(18)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlachtfeld)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Reichweite)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetVulkanChance
        Inherits Ereignis
        Dim Chance As Single
        Dim X As Integer
        Dim Y As Integer
        Dim Schlachtfeld As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Chance As Single, Optional ByVal Schlachtfeld As Integer = -1)
            Me.X = X
            Me.Y = Y
            Me.Chance = Chance
            Me.Schlachtfeld = Schlachtfeld
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Volcan Acitvity at X=" + X.ToString + " ; Y=" + Y.ToString + " to " + Chance.ToString)
            End If
            If Schlachtfeld < 0 Then Schlachtfeld = ObjektSpielfeld.Bodenschlacht
            If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude IsNot Nothing Then
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude
                If TypeOf Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlachtfeld).Gebaeude Is GebaeudeVulkan Then
                    CType(Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, Schlachtfeld).Gebaeude, GebaeudeVulkan).FeuerbrockenProzent = Chance
                End If
            End If
        End Sub

        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlachtfeld = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Chance = BytesToSingle(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(19)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlachtfeld)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = SingletoBytes(Chance)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisSetBuildingDamage
        Inherits Ereignis
        Dim Schaden As Integer
        Dim X As Integer
        Dim Y As Integer
        Dim Schlachtfeld As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Schaden As Integer, Optional ByVal Schlachtfeld As Integer = -1)
            Me.X = X
            Me.Y = Y
            Me.Schaden = Schaden
            Me.Schlachtfeld = Schlachtfeld
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Set Building Damage at X=" + X.ToString + " ; Y=" + Y.ToString + " to " + Schaden.ToString)
            End If
            If Schlachtfeld < 0 Then Schlachtfeld = ObjektSpielfeld.Bodenschlacht
            If Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude IsNot Nothing Then
                Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude.Schaden = Schaden

            End If
        End Sub

        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schlachtfeld = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Schaden = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(20)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schlachtfeld)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Schaden)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisUnHideArea
        Inherits Ereignis
        Dim Hide As Boolean
        Dim X1, X2 As Integer
        Dim Y1, Y2 As Integer
        Public Sub New(ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal Hide As Boolean)
            If X1 < X2 Then
                Me.X1 = X1
                Me.X2 = X2
            Else
                Me.X1 = X2
                Me.X2 = X1
            End If
            If Y1 < Y2 Then
                Me.Y1 = Y1
                Me.Y2 = Y2
            Else
                Me.Y1 = Y2
                Me.Y2 = Y1
            End If
            Me.Hide = Hide
        End Sub

        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                If Hide Then
                    Konsole.Write("Script: Hide Area Left=" + X1.ToString + " ; Top=" + Y1.ToString + " ; Right=" + X2.ToString + " ; Bottom=" + Y2.ToString)
                Else
                    Konsole.Write("Script: Unhide Area Left=" + X1.ToString + " ; Top=" + Y1.ToString + " ; Right=" + X2.ToString + " ; Bottom=" + Y2.ToString)
                End If
            End If
            For X = X1 To X2
                For Y = Y1 To Y2
                    If Objektverwalter.Spielfeld.OnMap(X, Y, True) Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, 0).Hidden = Hide
                        Objektverwalter.Spielfeld.Landschaften(X, Y, 1).Hidden = Hide
                    End If
                Next
            Next
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|UnhideArea|" + X1.ToString + "|" + Y1.ToString + "|" + X2.ToString + "|" + Y2.ToString + "|" + Hide.ToString))
        End Sub

        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            Hide = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X1 = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y1 = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X2 = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y2 = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(21)
            StrW.WriteByte(Hide)
            Dim B(3) As Byte
            B = IntToBytes(X1)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y1)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(X2)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y2)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisAddVolcanTarget
        Inherits Ereignis
        Dim Day, TargetX, TargetY As Integer
        Dim X As Integer
        Dim Y As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Day As Integer, ByVal TargetX As Integer, ByVal TargetY As Integer)
            Me.X = X
            Me.Y = Y
            Me.Day = Day
            Me.TargetX = TargetX
            Me.TargetY = TargetY
        End Sub

        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Add Volcan Target at X=" + X.ToString + " ; Y=" + Y.ToString + " TargetX=" + TargetX.ToString + " ; TargetY=" + TargetY.ToString + " Startday=" + Day.ToString)
            End If
            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude IsNot Nothing Then
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                If TypeOf Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude Is GebaeudeVulkan Then
                    CType(Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude, GebaeudeVulkan).Targets.Add(New Microsoft.DirectX.Vector3(TargetX, TargetY, Day))
                End If
            End If
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Day = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            TargetX = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            TargetY = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(22)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Day)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(TargetX)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(TargetY)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisClearVolcanTarget
        Inherits Ereignis
        Dim X As Integer
        Dim Y As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer)
            Me.X = X
            Me.Y = Y
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Clear Volcan Targets at X=" + X.ToString + " ; Y=" + Y.ToString)
            End If
            If Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude IsNot Nothing Then
                Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
                If TypeOf Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude Is GebaeudeVulkan Then
                    CType(Objektverwalter.Spielfeld.Landschaften(G.Rechteck.X, G.Rechteck.Y, ObjektSpielfeld.Bodenschlacht).Gebaeude, GebaeudeVulkan).Targets.Clear()
                End If
            End If
        End Sub

        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(23)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Y)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisCreateFog
        Inherits Ereignis
        Dim Left As Integer
        Dim Top As Integer
        Dim Right As Integer
        Dim Bottom As Integer
        Dim Nebel As Nebelarten
        Dim Spieler As Integer
        Public Sub New(ByVal Left As Integer, ByVal Top As Integer, ByVal Right As Integer, ByVal Bottom As Integer, ByVal Nebel As Nebelarten, ByVal Spieler As Integer)
            Me.Left = Left
            Me.Top = Top
            Me.Right = Right
            Me.Bottom = Bottom
            Me.Nebel = Nebel
            Me.Spieler = Spieler
        End Sub

        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Create Fog in Area Left=" + Left.ToString + " ; Top=" + Top.ToString + " ; Right=" + Right.ToString + " ; Bottom=" + Bottom.ToString + " ; Fog=" + Sprachconverter.Translate(Nebel.ToString) + " for Player=" + Spieler.ToString)
            End If
            If Objektverwalter.Spielfeld.Regeln.NebelFelder Is Nothing Then
                Objektverwalter.Spielfeld.Regeln.NebelFelder = New List(Of ObjektRegeln.Nebelfeld)
            End If
            For X = Left To Right
                For Y = Top To Bottom
                    Objektverwalter.Spielfeld.Regeln.NebelFelder.Add(New ObjektRegeln.Nebelfeld(X, Y, Nebel, True, Spieler))
                Next
            Next
            Objektverwalter.Spielfeld.Sichterstellen(False)
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|CreateFog|" + Left.ToString + "|" + Top.ToString + "|" + Right.ToString + "|" + Bottom.ToString + "|" + CInt(Nebel).ToString + "|" + Spieler.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            Nebel = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Left = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Top = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Right = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Bottom = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(24)
            StrW.WriteByte(Nebel)
            Dim B(3) As Byte
            B = IntToBytes(Left)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Top)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Right)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Bottom)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisChangeCOPowerstate
        Inherits Ereignis
        Dim Spieler As Integer
        Dim PowerState As Boolean
        Public Sub New(ByVal Spieler As Integer, ByVal Powerstate As Boolean)
            Me.PowerState = Powerstate
            Me.Spieler = Spieler
        End Sub

        Public Overrides Sub Ausfuehren()
            If Konsole.ShowScript Then
                Konsole.Write("Script: Change Power State for Player=" + Spieler.ToString + " to " + PowerState.ToString)
            End If
            If Spieler > 0 And Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                Objektverwalter.Spielfeld.Spieler(Spieler).Gabeleiste = PowerState
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|ChangeCOPowerstate|" + Spieler.ToString + "|" + PowerState.ToString))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            PowerState = StrR.ReadByte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(25)
            StrW.WriteByte(PowerState)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
        End Sub
    End Class
    Public Class EreignisCreateCOClone
        Inherits Ereignis
        Dim Spieler As Integer
        Dim KONumber As Integer
        Dim KOID As String
        Dim KOBild As String
        Public Sub New(ByVal Spieler As Integer, ByVal KONumber As Integer, ByVal KOID As String, ByVal KOBild As String)
            Me.KONumber = KONumber
            Me.KOID = KOID
            Me.KOBild = KOBild
            Me.Spieler = Spieler
        End Sub

        Public Overrides Sub Ausfuehren()
            If KONumber > 1 Or KONumber < 0 Then
                KONumber = 0
            End If
            If Konsole.ShowScript Then
                Konsole.Write("Script: Create CO-Clone for Player=" + Spieler.ToString + " at " + KONumber.ToString + " to " + KOID)
            End If
            If Spieler > 0 And Spieler < Objektverwalter.Spielfeld.Spieler.Length Then
                Dim ID As Integer = 0
                For I = 0 To Objektverwalter.GetKOLength() - 1
                    If Objektverwalter.GetKO(I).KOID.ToLower = KOID.ToLower Then
                        ID = I
                        Exit For
                    End If
                Next
                Objektverwalter.Spielfeld.Spieler(Spieler).KOS(KONumber) = New KOClone(Spieler, ID, KOBild)
            End If
        End Sub
        Public Overrides Sub SendAction()
            Hauptmenue.Connection.SendData(New NetworkPaket("ScriptEvent|CreateCOClone|" + Spieler.ToString + "|" + KONumber.ToString + "|" + KOID + "|" + KOBild))
        End Sub
        Public Overrides Function Clone() As Object
            Return MemberwiseClone()
        End Function
        Public Overrides Sub Read(ByRef StrR As Filestream)
            Dim B(3) As Byte
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
            For I = 0 To B.Length - 1
                B(I) = StrR.ReadByte
            Next
            KONumber = BytesToInt(B)
            KOID = ReadString(StrR)
            KOBild = ReadString(StrR)
        End Sub

        Public Overrides Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(26)
            Dim B(3) As Byte
            B = IntToBytes(Spieler)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            B = IntToBytes(KONumber)
            For I = 0 To B.Length - 1
                StrW.WriteByte(B(I))
            Next
            WriteString(StrW, KOID)
            WriteString(StrW, KOBild)
        End Sub
    End Class
#End Region


End Class
